import { logoutAPI } from '@/services/login'
import { clearUser, userInfo } from '@/stores/user'
import type { LoginResult } from '../types/login'
import { baseURL, FORM_CONTENT_TYPE } from './config'
import { Data } from '../types/global'





/**
 *  封装请求方法
 * @template T 响应数据中 `data` 字段的类型，用于指定接口返回的核心数据类型
 * @param options 请求参数
 */
export const http = <T>(options : UniApp.RequestOptions) => {
	return new Promise<Data<T>>((resolve, reject) => {
		uni.request({
			// 1.请求参数
			...options,
			// 2.响应成功
			success(res) {
				// console.log('http请求成功', res)
				//2.1 状态吗，这个是http状态码
				if (res.statusCode >= 200 && res.statusCode < 300) {
					if (options.url === '/auth/oauth2/token') {//这个接口特殊处理，请求结果和其他接口不一样
						resolve({
							code: '1',
							msg: '登录成功',
							data: res.data as LoginResult,
						} as Data<T>)
					} else {
						resolve(res.data as Data<T>)
					}
				} else if (res.statusCode === 401 || res.statusCode === 424) {
					//2.2 都是未授权，那么就清理后台token
					// 清理用户信息
					clearUser()
					//清理后台token
					logoutAPI()
					// 跳转到登录页
					uni.navigateTo({ url: '/pages/login/index' })
				} else { //2.3 其他错误
					uni.showToast({
						icon: 'none',
						title: (res.data as Data<T>).msg || '请求错误',
					})
					reject(res)
				}
			},
			// 3.响应失败
			fail(err) {
				uni.showToast({
					icon: 'none',
					title: '网络错误，换个网络试试',
				})
				reject(err)
			},
		})
	})
}


/**
 * 拦截器配置
 * 1. 非 http 开头需拼接地址
 * 2. 添加请求头

 */
const httpInterceptor = {
	// 拦截前触发
	invoke(options : UniApp.RequestOptions) {
		// console.log('invoke', options)
		// 1. 非 http 开头需拼接地址
		if (!options.url.startsWith('http')) {
			options.url = baseURL + options.url
		}

		// 2.初始化 header，避免 options.header 为 undefined 的情况
		options.header = options.header || {};

		// 3.设置请求超时时间
		options.timeout = 10000;

		// 4. 添加 Authorization 请求头
		options.header.Authorization = getBasicAuth('');

		// 5.只有请求包含 /auth/ 时，才设置 Content-Type 为 FORM_CONTENT_TYPE
		if (options.url.includes('/auth/')) {
			options.header['Content-Type'] = FORM_CONTENT_TYPE;
		}
	},

}











// 拦截 request 请求
uni.addInterceptor('request', httpInterceptor)
// 拦截 uploadFile 文件上传
uni.addInterceptor('uploadFile', httpInterceptor)


/**
 * 获取basicAuth
 * 如果没有登录，那么basicAuth开头是Basic，如果已经登录了，那么开头是Bearer
 */
function getBasicAuth(basicAuth : string) {
	// 获取用户信息
	//1.如果没有登录，那么basicAuth开头是Basic
	if (!userInfo.value?.basicAuth) {
		const model = 'custom:custom'
		const uint8Array = new TextEncoder().encode(model)
		const arrayBuffer = uint8Array.buffer as ArrayBuffer
		return 'Basic ' + uni.arrayBufferToBase64(arrayBuffer)
	} else {
		//2.如果已经登录，那么basicAuth开头是Bearer
		return `${userInfo.value?.basicAuth}`

	}
}